package gagak.framework.web.paramresovler.requestbody;



import gagak.framework.web.support.http.MediaType;

import java.io.IOException;
import java.util.List;

/*
 * @author houhong
 * <p>
 * 它负责讲一个请求信息转换成一个对象（类型为T）
 * 并将对象（类型为T） 绑定到请求方法的参数中或输出为响应信息
 * 这是一个策略接口
 */
public interface HttpMessageConverter<T> {

    /*
     * 指定转换器可以读取的对象类型，即转换器可将请求信息转换为clazz类型的对象
     */
    boolean canRead(Class<?> clazz, MediaType mediaType);

    /*
     * 指定转换器可以将clazz类型的对象写到响应流当中，响应流支持的媒体类型在mediaType中定义
     */
    boolean canWrite(Class<?> clazz, MediaType mediaType);


    /*
     * 返回当前转换器支持的媒体类型
     */
    List<MediaType> getSupportedMediaTypes();

    /*
     * 将请求信息转换为T类型的对象 流对象为：HttpInputMessage
     */
    T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
            throws IOException;

    /*
    *   将T类型的对象写到响应流当中，同时指定响应的媒体类型为contentType 输出流为：HttpOutputMessage
    */
    void write(T t, MediaType contentType, HttpOutputMessage outputMessage)
            throws IOException;

}
